package com.gylang.springmini.lifecycle;

import com.gylang.springmini.exception.BeansException;
import org.springframework.lang.Nullable;

/**
 * @author gylang
 * data 2021/11/13
 */
public interface BeanPostProcessor {


    /**
     * 实例化bean之后回调方法
     *
     * @param bean     bean的实例
     * @param beanName bean的名称
     * @return true 阻断后续的回调方法
     * @throws BeansException 执行回调过程中产生的错误
     */
    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    /**
     * bean实例化之前回调
     *
     * @param clzzz bean的类型
     * @param beanName  bean的名称
     * @return 执行完回调后返回的实例对象
     * @throws BeansException 执行回调过程中产生的错误
     */
    @Nullable
    default Object postProcessBeforeInstantiation(Class<?> clzzz, String beanName) throws BeansException {
        return null;
    }

    /**
     * 对所有的bean执行初始化之前回调
     *
     * @param bean     bean的实例
     * @param beanName bean的名称
     * @return 修改后的bean对象
     * @throws BeansException 初始化回调执行的异常错误
     */
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    /**
     * 对所有的bean执行初始化之后回调
     *
     * @param bean     bean的实例
     * @param beanName bean的名称
     * @return 操作后的bean
     * @throws BeansException 初始化之后回调执行的异常错误
     */
    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}
